//=============================================================================
// DEFINICIO DE LA CLASSE 'FILEMANAGER'
//=============================================================================
// per Marc Delgado (marcdelgado@gmail.com) | rev. 2012.06.11

#ifndef FILEMANAGER_HPP
#define	FILEMANAGER_HPP

#include "directoryManager.hpp"
#include "variables.hpp"
#include "utils.hpp"
#include <list>
#include <iostream>
using namespace std;

//La paraula 'list' era polisèmica.
typedef list<unsigned short> llistaPags;
//Definim 'hole' com una pàgina i la posició de registre
typedef pair<unsigned short, unsigned short> hole;

class fileManager
{
    public:
        //CONSTRUCTORA que rep la ruta del disc virtual.
        fileManager(char* pDisk);
        //CREARF: crea un fitxer dintre del disc virtual.
        bool crearf(char* pFile, const unsigned char &pType, const unsigned char &pMR, const unsigned char &pMCC);
        //DELF: esborra un fitxer dintre del disc virtual.
        bool delf(char* pFile);
        //INSERTR: insereix un registre en un fitxer.
        bool insertr(char* pFile, char* pKey, char* pData);
        //DELR: esborra un registre en un fitxer.
        bool delr(char* pFile, char* pKey);
        //QUERY: permet consultar per rang o coincidencia, en un registre.
        pair<list<char*>,int> query(char* pFile, const char &pType, char* pKey1, char* pKey2);
        //DESTRUCTORA que tanca el fitxer.
        ~fileManager();

    private:
        //Valors predefinits de mides:
        static const int _sName = 6;    //Mida del nom de fitxer.
        static const int _sNPAG = 2;    //Mida de punter a pàgina.
        static const int _sOffLeaf = 2; //Offset de fulla.
        static const int _sOffNode = 2; //Offset de node.
        static const int _sPage = 1024;  //Mida de la pàgina.

        directoryManager *_dman;    //Manipulador del disc virtual (sessio 4)
        char* _actFile;             //Nom del fitxer del disc que estem manipulant.

        //FUNCIONS AUXILIARS (Ja tenim actiu un fitxer del disc.)
        //READREG: retorna un punter a un registre, segons la coordenada de 'hole'.
        char* readReg(const hole &pHole);
        //WRITEREG: escriu un registre en un 'hole'.
        bool writeReg(const hole &pHole, char* pReg);
        //FINDKEY: cerca una clau dins d'un fitxer i retorna el hole.
        hole findKey(char* pKey);
        //FINDEMPTY: cerca el primer hole buit dins d'un fitxer.
        hole findEmpty();

        //FUNCIONS GETTERS (sobre fitxer acual)
        //GETMAXREGS: retorna el nombre màxim de registres que caben a una pàgina, segons el fitxer.
        unsigned short getMaxRegs();
        //GETMAXKEYS: retorna el nombre màxim de claus que caben en una pàgina, segons el fitxer.
        unsigned char getSizeReg();
        //GETSIZEKEYS: retorna la mida de la clau, segons el fitxer.
        unsigned char getSizeKey();
};


#endif
